#ifndef __TEMPLATE_DRIVER_H
#define __TEMPLATE_DRIVER_H

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include <linux/errno.h>
#include <linux/delay.h>
#include <linux/timer.h>
// 设备号操作
#include <linux/types.h>
#include <linux/kdev_t.h>
// device tree
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/of_address.h>
// interrupt
#include <linux/interrupt.h>
#include <linux/gpio.h>
// chardev device class
#include <linux/cdev.h>	
#include <linux/device.h> 


#define CHARDEV_NAME    		"bmp280"	            // 定义设备名称 在/proc/devices下查看
#define DEVICE_NUMBER 			1		 		        // 定义次设备号的个数
#define DEVICE_MINOR_NUMBER 	0 				        // 定义次设备号的起始地址
#define DEVICE_CLASS_NAME 		"bmp280_class" 	        // 在/sys/class下查看
#define DEVICE_NODE_NAME 		"bmp280" 		        // 定义设备节点的名字 在/dev/下查看
#define OF_MATCH_COMPATILBLE    "bmp280"                // 设备树compatilble属性
#define ID_TABLE_COMPATILBLE    "bmp280"                // id_table compatilble属性
#define INTERRUPT_NAME          "interrupt_irq_bmp280"  // 中断名

#define BMP280_RESET_VALUE					0xB6		//复位寄存器写入值
#define BMP280_S32_t long signed int
#define BMP280_U32_t long unsigned int
#define BMP280_S64_t long long signed int

#define BMP280_ADDRESS						0x76		//从设备地址
#define BMP280_RESET_VALUE					0xB6		//复位寄存器写入值

#define BMP280_CHIPID_REG                    0xD0  /*Chip ID Register */
#define BMP280_RESET_REG                     0xE0  /*Softreset Register */
#define BMP280_STATUS_REG                    0xF3  /*Status Register */
#define BMP280_CTRLMEAS_REG                  0xF4  /*Ctrl Measure Register */
#define BMP280_CONFIG_REG                    0xF5  /*Configuration Register */
#define BMP280_PRESSURE_MSB_REG              0xF7  /*Pressure MSB Register */
#define BMP280_PRESSURE_LSB_REG              0xF8  /*Pressure LSB Register */
#define BMP280_PRESSURE_XLSB_REG             0xF9  /*Pressure XLSB Register */
#define BMP280_TEMPERATURE_MSB_REG           0xFA  /*Temperature MSB Reg */
#define BMP280_TEMPERATURE_LSB_REG           0xFB  /*Temperature LSB Reg */
#define BMP280_TEMPERATURE_XLSB_REG          0xFC  /*Temperature XLSB Reg */
//状态寄存器转换标志
#define	BMP280_MEASURING					0x01
#define	BMP280_IM_UPDATE					0x08



// 驱动结构体
struct bmp280_driver_class{
    /* 设备号 */
    int major_num;  // 主设备号
    int minor_num;  // 次设备号
    dev_t dev_num;  // dev_t 是个 32 位的变量，其中 12 位用来表示主设备号，20 位用来表示次设备号 

    /* 设备树节点 */
    struct device_node *m_device_node; 

    /* 字符设备结构体 */
    struct cdev cdev;  

    /* 创建设备节点 */
    struct class *class;        // 类 
    struct device *device;       // 设备 

    /* 定时器 */
    struct timer_list timer;

    /* 中断相关 */
    int irq_num;
    struct tasklet_struct tasklet; /* 中断下文 tasklet */

    /* 片选 */
    int cs_gpio;

    /* 私有数据 */
    struct spi_device *spix;         
    long temp, press;          /* 传感器数据 温度、压力值*/
};

#endif // __TEMPLATE_DRIVER_H